package model; import java.util.ArrayList; import java.util.StringTokenizer; /** * @author iulia * * The class extends Polynomial and represents an integer polynomial. * */ public class IntPolynomial extends Polynomial<Integer> { public IntPolynomial() { super(); } /** * Creates a polynomial from a string received from input. * * @param poly * @throws NotAPolynomialException */ public IntPolynomial(String poly) throws NotAPolynomialException { monomials = new ArrayList<Monomial<Integer>>(); int pos = 0; char sign = 0; if (poly.length() == 0) { throw new NotAPolynomialException("The polynomial cannot be created!"); } if (poly.charAt(0) == '-') { sign = '-'; poly = poly.substring(1); } StringTokenizer stSign = new StringTokenizer(poly, "+-"); while (stSign.hasMoreTokens()) { String monomial = stSign.nextToken(); pos += monomial.length(); StringTokenizer stMonomial = new StringTokenizer(monomial, "*"); int coeff = 0, exp = 0; String coeffStr = stMonomial.nextToken(); String expStr; try { coeff = Integer.parseInt(coeffStr); } catch (NumberFormatException e) { throw new NotAPolynomialException("The polynomial cannot be created!"); } if (sign == '-') coeff = -coeff; int posMonomial = coeffStr.length() + 3; if (posMonomial < monomial.length()) expStr = monomial.substring(posMonomial); else throw new NotAPolynomialException("The polynomial cannot be created!"); try { exp = Integer.parseInt(expStr); } catch (NumberFormatException e) { throw new NotAPolynomialException("The polynomial cannot be created!"); } if (pos < poly.length()) { sign = poly.charAt(pos); pos++; } if (!addToMonomialsList(coeff, exp)) throw new NotAPolynomialException("The polynomial cannot be created!"); } } @Override public boolean addToMonomialsList(Integer coefficient, int exponent) { if (coefficient == 0) return true; int i = 0; Monomial<Integer> monomial = new Monomial<>(coefficient, exponent); while (i < monomials.size() && monomials.get(i).getExponent() < exponent) i++; if (i == monomials.size()) { monomials.add(monomial); return true; } else { if (monomials.get(i).getExponent() > exponent) { monomials.add(i, monomial); return true; } } return false; } @Override public String printPoly() { StringBuffer str = new StringBuffer(); int i = monomials.size(); if (i == 0) { return str.append("0").toString(); } while (i > 1) { i--; str.append(" "); str.append(Integer.toString((int) monomials.get(i).getCoefficient())); str.append("*x^"); str.append(Integer.toString(monomials.get(i).getExponent())); str.append(" "); if ((int) monomials.get(i - 1).getCoefficient() > 0) str.append("+"); System.out.print(monomials.get(i).getCoefficient() + "*x^" + monomials.get(i).getExponent() + " + "); } i--; str.append(" "); str.append(Integer.toString((int) monomials.get(i).getCoefficient())); str.append("*x^"); str.append(Integer.toString(monomials.get(i).getExponent())); System.out.println(monomials.get(i).getCoefficient() + "*x^" + monomials.get(i).getExponent()); return str.toString(); } }